From 026d31df5c1e047525c5d159d2905650e805c662 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Thu, 15 Dec 2005 21:50:12 +0100 Subject: [PATCH] Add debugging flag for domains to make domu debugging a run-time option Signed-off-by: Kip Macy kmacy@fsmware.ckm --- .../gdb/gdbserver/linux-xen-low.c | 5 -- tools/libxc/xc_ptrace.c | 22 ++++-- xen/Rules.mk | 5 -- xen/common/dom0_ops.c | 16 +++++ xen/include/asm-x86/debugger.h | 67 +++++++++---------- xen/include/public/dom0_ops.h | 9 ++- xen/include/xen/sched.h | 4 ++ 7 files changed, 75 insertions(+), 53 deletions(-) diff --git a/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c b/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c index 02d39ed621..786d0dcd0c 100644 --- a/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c +++ b/tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c @@ -231,11 +231,6 @@ linux_wait (char *status) if (myxcwait(xc_handle, current_domid, &w, 0)) return -1; - if (w & (DOMFLAGS_SHUTDOWN|DOMFLAGS_DYING)) { - *status = 'W'; - return 0; - } - linux_set_inferior(); *status = 'T'; diff --git a/tools/libxc/xc_ptrace.c b/tools/libxc/xc_ptrace.c index 11515011be..0bf365a314 100644 --- a/tools/libxc/xc_ptrace.c +++ b/tools/libxc/xc_ptrace.c @@ -345,8 +345,6 @@ xc_ptrace( void *addr = (char *)eaddr; void *data = (char *)edata; - op.interface_version = DOM0_INTERFACE_VERSION; - cpu = (request != PTRACE_ATTACH) ? domid_tid : 0; switch ( request ) @@ -434,6 +432,13 @@ xc_ptrace( } } } + if ( request == PTRACE_DETACH ) + { + op.cmd = DOM0_SETDEBUGGING; + op.u.setdebugging.domain = current_domid; + op.u.setdebugging.enable = 0; + retval = do_dom0_op(xc_handle, &op); + } regs_valid = 0; xc_domain_unpause(xc_handle, current_domid > 0 ? current_domid : -current_domid); break; @@ -453,10 +458,15 @@ xc_ptrace( printf("domain currently paused\n"); } else retval = xc_domain_pause(xc_handle, current_domid); - if (get_online_cpumap(xc_handle, &op.u.getdomaininfo, &cpumap)) - printf("get_online_cpumap failed\n"); - if (online_cpumap != cpumap) - online_vcpus_changed(cpumap); + op.cmd = DOM0_SETDEBUGGING; + op.u.setdebugging.domain = current_domid; + op.u.setdebugging.enable = 1; + retval = do_dom0_op(xc_handle, &op); + + if (get_online_cpumap(xc_handle, &op.u.getdomaininfo, &cpumap)) + printf("get_online_cpumap failed\n"); + if (online_cpumap != cpumap) + online_vcpus_changed(cpumap); break; case PTRACE_SETFPREGS: diff --git a/xen/Rules.mk b/xen/Rules.mk index f9721f03a2..276659053a 100644 --- a/xen/Rules.mk +++ b/xen/Rules.mk @@ -6,7 +6,6 @@ verbose ?= n debug ?= n perfc ?= n perfc_arrays?= n -domu_debug ?= n crash_debug ?= n XEN_ROOT=$(BASEDIR)/.. @@ -54,10 +53,6 @@ else CFLAGS += -g -DVERBOSE endif -ifeq ($(domu_debug),y) -CFLAGS += -DDOMU_DEBUG -endif - ifeq ($(crash_debug),y) CFLAGS += -g -DCRASH_DEBUG endif diff --git a/xen/common/dom0_ops.c b/xen/common/dom0_ops.c index c479e5efa4..1505dc782d 100644 --- a/xen/common/dom0_ops.c +++ b/xen/common/dom0_ops.c @@ -577,6 +577,22 @@ long do_dom0_op(dom0_op_t *u_dom0_op) } } break; + case DOM0_SETDEBUGGING: + { + struct domain *d; + ret = -ESRCH; + d = find_domain_by_id(op->u.setdebugging.domain); + if ( d != NULL ) + { + if ( op->u.setdebugging.enable ) + set_bit(_DOMF_debugging, &d->domain_flags); + else + clear_bit(_DOMF_debugging, &d->domain_flags); + put_domain(d); + ret = 0; + } + } + break; #ifdef PERF_COUNTERS case DOM0_PERFCCONTROL: diff --git a/xen/include/asm-x86/debugger.h b/xen/include/asm-x86/debugger.h index aa2050f849..241c12d1f8 100644 --- a/xen/include/asm-x86/debugger.h +++ b/xen/include/asm-x86/debugger.h @@ -30,6 +30,8 @@ #ifndef __X86_DEBUGGER_H__ #define __X86_DEBUGGER_H__ +#include +#include #include /* The main trap handlers use these helper macros which include early bail. */ @@ -41,9 +43,10 @@ #if defined(CRASH_DEBUG) extern int __trap_to_cdb(struct cpu_user_regs *r); -#define debugger_trap_entry(_v, _r) (0) -static inline int debugger_trap_fatal( +#define __debugger_trap_entry(_v, _r) (0) + +static inline int __debugger_trap_fatal( unsigned int vector, struct cpu_user_regs *regs) { (void)__trap_to_cdb(regs); @@ -51,60 +54,52 @@ static inline int debugger_trap_fatal( } /* Int3 is a trivial way to gather cpu_user_regs context. */ -#define debugger_trap_immediate() __asm__ __volatile__ ( "int3" ); - -#elif defined(DOMU_DEBUG) - -#include -#include - -static inline int debugger_trap_entry( - unsigned int vector, struct cpu_user_regs *regs) -{ - struct vcpu *v = current; - - if ( !KERNEL_MODE(v, regs) || (v->domain->domain_id == 0) ) - return 0; - - switch ( vector ) - { - case TRAP_int3: - case TRAP_debug: - domain_pause_for_debugger(); - return 1; - } - - return 0; -} - -#define debugger_trap_fatal(_v, _r) (0) -#define debugger_trap_immediate() +#define __debugger_trap_immediate() __asm__ __volatile__ ( "int3" ); #elif 0 extern int kdb_trap(int, int, struct cpu_user_regs *); -static inline int debugger_trap_entry( +static inline int __debugger_trap_entry( unsigned int vector, struct cpu_user_regs *regs) { return 0; } -static inline int debugger_trap_fatal( +static inline int __debugger_trap_fatal( unsigned int vector, struct cpu_user_regs *regs) { return kdb_trap(vector, 0, regs); } /* Int3 is a trivial way to gather cpu_user_regs context. */ -#define debugger_trap_immediate() __asm__ __volatile__ ( "int3" ); +#define __debugger_trap_immediate() __asm__ __volatile__ ( "int3" ) #else -#define debugger_trap_entry(_v, _r) (0) -#define debugger_trap_fatal(_v, _r) (0) -#define debugger_trap_immediate() +#define __debugger_trap_entry(_v, _r) (0) +#define __debugger_trap_fatal(_v, _r) (0) +#define __debugger_trap_immediate() ((void)0) #endif +static inline int debugger_trap_entry( + unsigned int vector, struct cpu_user_regs *regs) +{ + struct vcpu *v = current; + + if ( KERNEL_MODE(v, regs) && + test_bit(_DOMF_debugging, &v->domain->domain_flags) && + ((vector == TRAP_int3) || (vector == TRAP_debug)) ) + { + domain_pause_for_debugger(); + return 1; + } + + return __debugger_trap_entry(vector, regs); +} + +#define debugger_trap_fatal(v, r) (__debugger_trap_fatal(v, r)) +#define debugger_trap_immediate() (__debugger_trap_immediate()) + #endif /* __X86_DEBUGGER_H__ */ diff --git a/xen/include/public/dom0_ops.h b/xen/include/public/dom0_ops.h index cf40e39c3e..b6b5914200 100644 --- a/xen/include/public/dom0_ops.h +++ b/xen/include/public/dom0_ops.h @@ -404,6 +404,12 @@ typedef struct { xen_domain_handle_t handle; } dom0_setdomainhandle_t; +#define DOM0_SETDEBUGGING 45 +typedef struct { + domid_t domain; + uint8_t enable; +} dom0_setdebugging_t; + typedef struct { uint32_t cmd; uint32_t interface_version; /* DOM0_INTERFACE_VERSION */ @@ -440,7 +446,8 @@ typedef struct { dom0_platform_quirk_t platform_quirk; dom0_physical_memory_map_t physical_memory_map; dom0_max_vcpus_t max_vcpus; - dom0_setdomainhandle_t setdomainhandle; + dom0_setdomainhandle_t setdomainhandle; + dom0_setdebugging_t setdebugging; uint8_t pad[128]; } u; } dom0_op_t; diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index ef7bd9190f..80d17a5e24 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -393,6 +393,10 @@ extern struct domain *domain_list; /* Domain is paused by controller software. */ #define _DOMF_ctrl_pause 6 #define DOMF_ctrl_pause (1UL<<_DOMF_ctrl_pause) + /* Domain is being debugged by controller software. */ +#define _DOMF_debugging 7 +#define DOMF_debugging (1UL<<_DOMF_debugging) + static inline int domain_runnable(struct vcpu *v) { -- 2.30.2